package com.jg.utils.Thread;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * Callable接口实现多线程的方式比较复杂，但是却能解决不少问题，实现流程如下。
 * 创建Callable接口的实现类 ，并实现Call方法
 * 创建Callable实现类的实现，使用FutureTask类包装Callable对象，该FutureTask对象封装了
 * Callable对象的Call方法的返回值
 * 使用FutureTask对象作为Thread对象的target创建并启动线程
 * 调用FutureTask对象的get()来获取子线程执行结束的返回值
 */
class ThreadCallable {
    public static void main(String[] args) {

        // 创建MyCallable对象
        Callable<String> myCallable = new Shopping();
// 使用FutureTask来包装MyCallable对象
        FutureTask<String> ft = new FutureTask<>(myCallable);
// FutureTask对象作为Thread对象的target创建新的线程
        Thread thread = new Thread(ft);


// 启动线程
        thread.start();
        System.out.println("启动线程！");



        try {


// 取得新创建的新线程中的call()方法返回的结果
            String result = ft.get();
            System.out.println("获取执行结果");
            System.out.println(result);

        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("mian");
    }
}

    class Shopping implements Callable<String> {
        @Override
        public String call() throws InterruptedException {
            System.out.println("空调配送中。。。。。。。");
//            模拟一下空调配送过程的耗时
            Thread.sleep(10000);
            System.out.println("快送到家了");
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new
                    Date()) + "空调送到家啦";
        }
}


